home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
- * 1.10*
- * XAES: Dialog-forming library *
- * by Ken Hollis *
- * *
- * Copyright (c) 1994, Bitgate Software. All Rights Reserved. *
- * *
- * This is that type of module that desperately cries out, "PLEASE!*
- * OPTIMIZE ME!" It shall be done soon... I just need to get *
- * around to speeding things up in the next release... *
- * *
- ********************************************************************/
-
- #include "xaes.h"
-
- GLOBAL void Objc_Change(WINDOW *win, int ob_cobject, int ob_crecvd, int ob_cnewstate, int ob_credraw)
- {
- if (win)
- if (win->tree || win->iconify) {
- objc_change((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, ob_crecvd, 0, 0, 0, 0, ob_cnewstate, 0);
-
- if ((ob_credraw) && (win->state & W_OPEN)) {
- GRECT own, temp;
- int x, y, tx, ty, tw, th;
-
- WMoveWindow(win, -1, -1, -1, -1);
-
- objc_offset((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, &x, &y);
- wind_get(win->handle, WF_WORKXYWH, &tx, &ty, &tw, &th);
-
- if (win->style & W_CUSTOMWINDOW) {
- if (win->wind_type == WC_WINDOW) {
- own.g_x = tx + win->wind[25].ob_x - 1;
- own.g_y = ty + win->wind[25].ob_y - 1;
- own.g_w = win->wind[25].ob_width + 1;
- own.g_h = win->wind[25].ob_height + 1;
- }
-
- if (win->wind_type == WC_SWINDOW) {
- own.g_x = tx + win->wind[32].ob_x - 1;
- own.g_y = ty + win->wind[32].ob_y - 1;
- own.g_w = win->wind[32].ob_width + 1;
- own.g_h = win->wind[32].ob_height + 1;
- }
- } else {
- own.g_x = tx;
- own.g_y = ty;
- own.g_w = tw;
- own.g_h = th;
- }
-
- wind_update(BEG_UPDATE);
-
- WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- WMoveWindow(win, -1, -1, -1, -1);
-
- while (temp.g_w && temp.g_h) {
- if (rc_intersect(&temp, &own)) {
- switch ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[ob_cobject].ob_type & 0xFF : win->tree[ob_cobject].ob_type & 0xFF)) {
- case G_BUTTON:
- case G_USERDEF:
- case G_BOXCHAR:
- case G_BOX:
- case G_STRING:
- case G_IMAGE:
- if (ob_cobject == 0)
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- else
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, 2, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
-
- break;
-
- default:
- if ((ob_cobject == 0) || ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[ob_cobject].ob_type & 0x0F : win->tree[ob_cobject].ob_type & 0x0F)) == G_IMAGE)
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- else
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, 2, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
-
- break;
- }
- }
-
- WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- }
-
- wind_update(END_UPDATE);
- }
-
- WMoveWindow(win, -1, -1, -1, -1);
- }
- }
-
- GLOBAL void WObjc_Change(WINDOW *win, int ob_cobject, int ob_crecvd, int ob_cnewstate, int ob_credraw)
- {
- if (win)
- if (win->style & W_CUSTOMWINDOW) {
- objc_change(win->wind, ob_cobject, ob_crecvd, 0, 0, 0, 0, ob_cnewstate, 0);
-
- if ((ob_credraw) && (win->state & W_OPEN)) {
- GRECT own, temp;
- int x, y, tx, ty, tw, th;
-
- objc_offset(win->wind, ob_cobject, &x, &y);
- wind_get(win->handle, WF_WORKXYWH, &tx, &ty, &tw, &th);
-
- own.g_x = tx;
- own.g_y = ty;
- own.g_w = tx + tw;
- own.g_h = ty + th;
-
- wind_update(BEG_UPDATE);
-
- WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- WMoveWindow(win, -1, -1, -1, -1);
-
- while (temp.g_w && temp.g_h) {
- if (rc_intersect(&temp, &own))
- switch (win->wind[ob_cobject].ob_type & 0xff) {
- case G_BUTTON:
- case G_USERDEF:
- case G_BOXCHAR:
- case G_BOX:
- case G_STRING:
- case G_IMAGE:
- if (ob_cobject == 0)
- objc_draw(win->wind, 0, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- else
- objc_draw(win->wind, ob_cobject, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- break;
-
- default:
- if ((ob_cobject == 0) || ((win->wind[ob_cobject].ob_type & 0x0F) == G_IMAGE))
- objc_draw(win->wind, 0, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- else
- objc_draw(win->wind, ob_cobject, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- break;
- }
-
- WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- }
-
- wind_update(END_UPDATE);
- }
- }
-
- WMoveWindow(win, -1, -1, -1, -1);
- }
-
- GLOBAL int WForm_button(WINDOW *win, int obj, int clicks, int *nxtobj)
- {
- OBJECT *tree, *obptr;
- int flags, state;
-
- if (win) {
- if ((clicks == 2) && (*nxtobj == win->icon_num))
- WWindSet(win, WF_UNICONIFIED, 1);
- else {
- WMoveWindow(win, -1, -1, -1, -1);
-
- tree = (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree);
- obptr = tree + obj;
- flags = obptr->ob_flags;
- state = obptr->ob_state;
-
- if (helpmode) {
- WCallBHelpDispatcher(win, obj);
- return 1;
- }
-
- wind_update(BEG_MCTRL);
-
- if (clicks == 2) {}
- if (clicks == 3) {}
- if ((flags & SELECTABLE) && ! (state & DISABLED)) {
- *nxtobj = obj;
-
- if ((flags & RBUTTON) && (state & SELECTED))
- no_click();
- else {
- state ^= SELECTED;
- if (flags & (RBUTTON | TOUCHEXIT)) {
- if (flags & SELECTABLE)
- Objc_Change(win, obj, 0, state, 1);
-
- if (flags & TOUCHEXIT) {
- int d, button;
-
- do {
- graf_mkstate(&d, &d, &button, &d);
- switch((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_type >> 8 : win->tree[obj].ob_type >> 8)) {
- case SLIDERLEFT:
- case SLIDERRIGHT:
- case SLIDERUP:
- case SLIDERDOWN:
- case SLIDERTRACK:
- WHandleSlider(win, obj);
- break;
-
- case SLIDERSLIDE:
- if (xaes.config1 & X_MOUSESLIDERS) {
- EXTINFO *ex = (EXTINFO *)((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_spec.userblk->ub_parm : win->tree[obj].ob_spec.userblk->ub_parm));
-
- if (ex->te_slider.slide_type == SLIDER_HOR)
- WGrafMouse(LRSLIDE_MOUSE);
- if (ex->te_slider.slide_type == SLIDER_VER)
- WGrafMouse(UDSLIDE_MOUSE);
- }
-
- WHandleSlider(win, obj);
- break;
- }
-
- WCallDlgDispatcher(win, obj);
- } while(button);
-
- WGrafMouse(ARROW);
- }
-
- if (flags & RBUTTON) {
- register int act = obj, lst, new;
-
- for (;;) {
- lst = act;
- new = obptr->ob_next;
-
- for (;;) {
- act = new;
- obptr = tree + act;
-
- if (obptr->ob_tail == lst) {
- new = obptr->ob_head;
- lst = act;
- } else {
- if (act == obj)
- goto rb_exit;
-
- if ((obptr->ob_state & SELECTED) && (obptr->ob_flags & RBUTTON)) {
- Objc_Change(win, act, 0, obptr->ob_state ^ SELECTED, 1);
- goto rb_exit;
- } else
- break;
- }
- }
- }
- rb_exit: no_click();
- }
- } else {
- register OBJECT *ob = tree + obj;
- EVENT event;
- int x, y, dummy, events;
-
- event.ev_mflags = MU_BUTTON | MU_M1;
- event.ev_mbclicks = 1;
- event.ev_bmask = 0x11;
- event.ev_mbstate = 0;
-
- objc_offset(tree, obj, &event.ev_mm1x, &event.ev_mm1y);
- event.ev_mm1width = ob->ob_width;
- event.ev_mm1height = ob->ob_height;
-
- graf_mkstate(&x, &y, &dummy, &dummy);
- if (rc_inside(x, y, (GRECT *) &event.ev_mm1x)) {
- event.ev_mm1flags = 1;
- Objc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
- } else
- event.ev_mm1flags = 0;
-
- do {
- events = EvntMulti(&event);
- if (events & MU_M1) {
- event.ev_mm1flags = 1 - event.ev_mm1flags;
- Objc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
- }
- } while (!(events & MU_BUTTON));
-
- if (!(ob->ob_state & SELECTED))
- *nxtobj = 0;
- }
- }
- } else
- if (flags & EDITABLE)
- *nxtobj = obj;
- else
- *nxtobj = 0;
-
- wind_update(END_MCTRL);
-
- if (*nxtobj)
- if ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[*nxtobj].ob_flags & (EXIT | TOUCHEXIT) : win->tree[*nxtobj].ob_flags & (EXIT | TOUCHEXIT)))
- return 0;
- }
- }
-
- return 1;
- }
-
- GLOBAL void WUpdateWindow(WINDOW *win, int x, int y, int w, int h, int obj)
- {
- GRECT own, temp;
-
- if (win) {
- WMoveWindow(win, -1, -1, -1, -1);
-
- own.g_x = x;
- own.g_y = y;
- own.g_w = w;
- own.g_h = h;
-
- wind_update(BEG_UPDATE);
- wind_update(BEG_MCTRL);
-
- WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- WMoveWindow(win, -1, -1, -1, -1);
-
- while (temp.g_w && temp.g_h) {
- if (rc_intersect(&temp, &own))
- if (obj == 0)
- if ((win->wind) && (win->style & W_CUSTOMWINDOW)) {
- objc_draw(win->wind, 0, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- } else if (((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree)) && !(win->style & W_CUSTOMWINDOW))
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- else
- if ((win->wind) && (win->style & W_CUSTOMWINDOW))
- objc_draw(win->wind, obj, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
- else if (((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree)) && !(win->style & W_CUSTOMWINDOW))
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), obj, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
-
- WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- }
-
- wind_update(END_MCTRL);
- wind_update(END_UPDATE);
- }
-
- WMoveWindow(win, -1, -1, -1, -1);
- }
-
- GLOBAL void WUpdateWindowDlg(WINDOW *win, int obj)
- {
- GRECT own, temp;
- int tx, ty, tw, th;
-
- if (win) {
- WMoveWindow(win, -1, -1, -1, -1);
-
- if (win->state & W_OPEN) {
- wind_get(win->handle, WF_WORKXYWH, &tx, &ty, &tw, &th);
-
- if (obj == 0)
- if (win->style & W_CUSTOMWINDOW) {
- if (win->wind_type == WC_WINDOW) {
- own.g_x = tx + win->wind[25].ob_x - 1;
- own.g_y = ty + win->wind[25].ob_y - 1;
- own.g_w = win->wind[25].ob_width + 1;
- own.g_h = win->wind[25].ob_height + 1;
- }
-
- if (win->wind_type == WC_SWINDOW) {
- own.g_x = tx + win->wind[32].ob_x - 1;
- own.g_y = ty + win->wind[32].ob_y - 1;
- own.g_w = win->wind[32].ob_width + 1;
- own.g_h = win->wind[32].ob_height + 1;
- }
- } else {
- own.g_x = tx;
- own.g_y = ty;
- own.g_w = tw;
- own.g_h = th;
- }
- else {
- own.g_x = tx + (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_x - 1 : win->tree[obj].ob_x - 1);
- own.g_y = ty + (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_y - 1 : win->tree[obj].ob_y - 1);
- own.g_w = (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_width + 1 : win->tree[obj].ob_width + 1);
- own.g_h = (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_height + 1 : win->tree[obj].ob_height + 1);
- }
-
- wind_update(BEG_UPDATE);
- wind_update(BEG_MCTRL);
-
- WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- WMoveWindow(win, -1, -1, -1, -1);
-
- while (temp.g_w && temp.g_h) {
- if (rc_intersect(&temp, &own))
- if (obj != 0)
- if ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree))
- objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), obj, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
-
- WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
- }
-
- wind_update(END_MCTRL);
- wind_update(END_UPDATE);
- }
-
- WMoveWindow(win, -1, -1, -1, -1);
- }
- }
-
- GLOBAL int rc_intersect(GRECT *r1, GRECT *r2)
- {
- r1->g_w = min(r1->g_x + r1->g_w, r2->g_x + r2->g_w );
- r1->g_h = min(r1->g_y + r1->g_h, r2->g_y + r2->g_h );
- r1->g_x = max(r1->g_x, r2->g_x);
- r1->g_y = max(r1->g_y, r2->g_y);
- r1->g_w -= r1->g_x;
- r1->g_h -= r1->g_y;
- return (r1->g_w > 0 && r1->g_h > 0) ? TRUE : FALSE;
- }
-
- GLOBAL int rc_inside(int x, int y, GRECT *r)
- {
- return (x > r->g_x && x < (r->g_x + r->g_w) &&
- y > r->g_y && y < (r->g_y + r->g_h));
- }
-
- GLOBAL void no_click(void)
- {
- int dummy, bstate;
-
- graf_mkstate(&dummy, &dummy, &bstate, &dummy);
- if (bstate & 1)
- evnt_button(1, 3, 0, &dummy, &dummy, &dummy, &dummy);
- }